<?php
	
	class AlocacaoHorarioFixo{
		private $listaCursos;
		private $listaDisciplinas;
		private $listaSeries;
		private	$listaSalas;
		private $listaHorarios;
		private $isOrdenaDisciplina;
		private $arquivoSalas = "TesteSala02.txt";
		private $arquivoDisciplinas = "disciplinas.txt";
		private $arquivoHorarios = "testeHorarios.txt";
	
		function loadListas($ordenado = true){
			$fu = new FileUtils();
	    	// Carrega cursos
	    	$lista = $fu->load($this->arquivoDisciplinas);
	    	$this->listaCursos = $fu->splitDisciplinasCurso($lista);
	    	
	    	// Carrega salas
	    	$lista = $fu->load($this->arquivoSalas);
	    	$this->listaSalas = $fu->splitSalas($lista);
	    	
	    	// Carrega horarios
	    	$lista = $fu->load($this->arquivoHorarios);
	    	$this->listaHorarios = $fu->splitHorarioFixo($lista);
	    	
			$this->linkarHorarioCursos();
	    	
	    	if ($ordenado) {
		    	
	    		//se for alocacao por disciplina
	    		if ($this->isOrdenaDisciplina){
	    			// Ordena disciplinas
		    		$this->ordenaDisciplinas();
	    		} else{
	    			// Ordena series
	    			$this->ordenaSerie();
	    		}
	    		
		    	// Ordena salas
		    	$this->ordenaSalas();
	    	}
			
		}
		
		static function cmpQtdAlunos($a, $b) {
			return -strcmp($a->getQtdeAlunos(), $b->getQtdeAlunos());
		}
			
	    	
		static function cmpQtdAlunosSerie($a, $b) {
			return -strcmp($a->getQtdMediaAlunos(), $b->getQtdMediaAlunos());
		}
		
		static function cmpCapacidade($a, $b) {
			return -strcmp($a->getCapacidade(), $b->getCapacidade());
		}	
		
		function ordenaDisciplinas() {
			$listaRetorno = array();
			
			foreach ($this->listaCursos as $curso) {
				foreach ($curso->getSeries() as $serie) {
					$listaRetorno = array_merge($listaRetorno, $serie->getListaDisciplinas());
				}
			}
			
			usort($listaRetorno, "AlocacaoHorarioFixo::cmpQtdAlunos");
			$this->listaDisciplinas = $listaRetorno;
		}
		
		function ordenaSerie() {
			$listaRetorno = array();
			
			foreach ($this->listaCursos as $curso) {
				$listaRetorno = array_merge($listaRetorno, $curso->getSeries());
			}
			
			usort($listaRetorno, "AlocacaoHorarioFixo::cmpQtdAlunosSerie");
			
			$disciplinas = array();
			foreach ($listaRetorno as $serie) {
				$disciplinas = array_merge($disciplinas, $serie->getListaDisciplinas());
			}
			
			$this->listaDisciplinas = $disciplinas;
		}
		
		function ordenaSalas() {
			$listaRetorno = $this->listaSalas;
			
			usort($listaRetorno, "AlocacaoHorarioFixo::cmpCapacidade");
			
			$this->listaSalas = $listaRetorno;
		}
		
		
		function linkarHorarioCursos () {
			
			foreach ($this->listaHorarios as $matriz) {
				foreach ($matriz as $dia) {
					foreach ($dia as $aula) {
						// trocar para while
						$achou = false;
						foreach ($this->listaCursos as $curso) {
							if ($aula->getDisciplina()->getCurso()->getNome() == $curso->getNome()) {
								// trocar para while
								foreach ($curso->getSeries() as $serie) {
									if ($aula->getDisciplina()->getSerie()->getNumero() == $serie->getNumero()) {
										// trocar para while
										foreach ($serie->getListaDisciplinas() as $disciplina) {
											if ($aula->getDisciplina()->getNome() == $disciplina->getNome()) {
												$aula->setDisciplina($disciplina);
												$disciplina->setAula($aula);
												$achou = true;
											}
											if ($achou){
												break;
											}
										}
									}
									if ($achou){
										break;
									}
								}
							}
							if ($achou){
								break;
							}
						}
					}
				}
			}
		}
		
		
		function procurarSalas() {
			
			$i = 0;
			foreach ($this->listaHorarios as $matrizAula) {
				foreach ($matrizAula as $dia) {
					foreach ($dia as $aula) {
						foreach ($this->listaSalas as $sala) {
							if ($i % 2 == 0) {
								if ($sala->getMatrizAulasPos($aula->dia, $aula->hora) == null) {
									if ($sala->getCapacidade() >= $aula->getDisciplina()->getQtdeAlunos()) {
										// Aloca disciplina na sala
										$sala->setMatrizAulasPos($aula, $aula->getDia(), $aula->getHora());
										break;
									}
								}
							} else {
								if ($sala->getMatrizSegundoSemestrePos($aula->dia, $aula->hora) == null) {
									if ($sala->getCapacidade() >= $aula->getDisciplina()->getQtdeAlunos()) {
										// Aloca disciplina na sala no segundo semestre
										$sala->setMatrizSegundoSemestePos($aula, $aula->getDia(), $aula->getHora());
										break;
									}
								}
							}
						}
					}
				}
				$i++;
			}
		}
		
		function getListaSalas(){
			return $this->listaSalas;
		}
		
		function setArquivoSalas($arquivo){
			$this->arquivoSalas = $arquivo;
		}
		
		function setArquivoDisciplinas($arquivo){
			$this->arquivoDisciplinas = $arquivo;
		}
		
		function setArquivoHorarios($arquivo){
			$this->arquivoHorarios = $arquivo;
		}
		
		function setOrdenaPorDisciplina($d){
			$this->isOrdenaDisciplina = $d;
		}
		
	}
	
		
?>